# 检测书法文字
# 步骤：
# 1.读取图片 灰度 二值化处理
# 2.侵蚀去噪点 膨胀链接
# 3.闭合孔洞
# 4.边缘检测
# 5.画检测框


import cv2
import numpy as np
import matplotlib.pyplot as plt
# plt.rcParams['figure.dpi']=200

img = cv2.imread('./test_imgs/shufa.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 形态学图像处理 需要画面的主题为白色 
# 墨字是黑色的 所以要二值化并翻转   
# 字为白色 背景为黑色

# 二值化    输入图 比较的阈值 超出阈值被设定的值 模式
black_img = cv2.threshold(gray,   100,     255,   cv2.THRESH_BINARY_INV)
# 作用；将画面像素与比较阈值对比 小于它则设为0 大于它设为目标值
plt.imshow(gray,cmap='gray')

# --------------------------------------

# 边缘检测
edges = cv2.Canny(black_img,30,200)
plt.imshow(edges,cmap='gray')

# 找轮廓 
coutours,h = cv2.findContours(edges,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
img2 = img.copy()
for c in coutours:
    x,y,w,h = cv2.boundingRect(c)
                # 源图 矩形坐标左上角 矩形坐标右下角 颜色   线宽
    cv2.rectangle(img2,  (x,y),      (x+w,y+h),  (0,255,0),3)
plt.imshow(img2)

# --------------------------------------

# 这时候出来的图像是 大量字体是分成好几部分的   因为笔画会有断连
# 所以一个字体是由多个轮廓组成的
# 怎么办 可以想到用形态学膨胀 或者 closing，闭合（先膨胀再侵蚀）
# 1.先去噪 用侵蚀
kernel = np.ones((3,3),np.int8)
erosion1 = cv2.erode(black_img,  kernel,  iterations = 1)
plt.imshow(erosion1,cmap='gray')
# 2.再膨胀   大核 加 多迭代 可以解决断连问题
kernel = np.ones((10,10),np.int8)
dilation1 = cv2.dilate(erosion1,  kernel,  iterations = 2)
plt.imshow(dilation1,cmap='gray')

# 闭合
kernel = np.ones((10,10),np.int8)
closing1 = cv2.morphologyEx(dilation1,cv2.MORPH_CLOSE,kernel)
plt.imshow(closing1,cmap='gray')
# 边缘检测
edges1 = cv2.Canny(closing1,30,200)
plt.imshow(edges1,cmap='gray')
# 找轮廓 
coutours,h = cv2.findContours(edges1,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
img2 = img.copy()
for c in coutours:
    x,y,w,h = cv2.boundingRect(c)
                # 源图 矩形坐标左上角 矩形坐标右下角 颜色   线宽
    if w > 100 :    
        cv2.rectangle(img2,  (x,y),      (x+w,y+h),  (0,255,0),3)

plt.imshow(img2)



